# ERPL


## Sobre o projeto


### Licença
Eu declaro que este projeto está liberado ao domínio público.
Caso isto não seja legalmente possível, eu dou desde já autorização para qualquer pessoa de ler, usar, modificar e renomear qualquer arquivo deste repositório livremente.
Se necessário for, eu posso liberar meu código-fonte sob uma licença de software livre qualquer ou emitir uma licença comercial sem qualquer custo exceto os custos de envio.

### Versionamento
Este projeto será versionado sob o regime monotônico.
Para referência consulte [o Manifesto Monotônico](http://blog.appliedcompscilab.com/monotonic_versioning_manifesto/).

### Compilando
Basta possuir um compilador compatível com C99 e extensões GNU (GCC é altamente indicado) e GnuMake ou similar, daí rodar `make`.

O executável do interpretador se chama `erpl`.

O código-fonte atualmente não possui dependências além da biblioteca C padrão.

### Usando
(Em andamento)

#### Programas de exemplo
(Em andamento)

#### Distribuindo um programa
(Em andamento)

#### Opções e configurações do interpretador


## Sobre a linguagem
ERPL é um pequeno dialeto Lisp experimental, para estudo de design de linguagens.

### Sintaxe básica
ERPL é uma linguagem concatenativa e recebe seus tokens por padrão em notação polonesa reversa.

Isso quer dizer que todo tipo de dado em ERPL funciona como uma função alterando o estado de uma pilha operacional implícita.
Existe uma pilha na qual os dados à serem manipulados são dispostos pelo interpretador, e funções podem ser aplicadas aos dados na pilha, retornando valores na própria pilha. A ordem de acesso da pilha é: o último que entra é o primeiro que sai (em inglês, *Last In, First Out* ou *LIFO*).

Além disso, os objetos ou funções podem ser concatenadas para construir novas funções, por isso é uma linguagem concatenativa e possui propriedades únicas.
Existem outros detalhes importantes de ERPL que serão descritos nos capítulos seguintes.

Visualmente, os tokens são normalmente interpretados da esquerda para direita. O seguinte bloco demonstra código ERPL válido:

```"Hello " "world" append STDOUT puts```

Neste código, primeiramente dois objetos do tipo String são dispostos na pilha. Uma representação imaginária da pilha se segue, com os itens presentes nela numerados à partir de 1, representando o topo da pilha:

```
2: "Hello "
1: "world"
```

Logo após, a função nativa `append` é convocada, atuando sobre os dois objetos de tipo String e deixando seu retorno na pilha, o texto dos dois concatenado em um objeto só:

```1: "Hello world"```

Em seguida, a constante especial `STDOUT` é convocada, deixando um valor na pilha que será aproveitado em seguida pela função nativa `puts`:

```
2: "Hello world"
1: 1
```

A função `puts` recebe dois operandos, um objeto String e um inteiro representando um descritor de arquivo, daí envia o texto do objeto String para o descritor. No exemplo, o descritor de arquivo aponta para a saída de texto padrão do programa. Você deverá ver `Hello world` aparecer no seu terminal ou console de texto.

É útil notar que o caractere `;` demarca o início de uma linha de comentário em ERPL. Todo texto que aparecer entre o `;` e o final da linha é ignorado pelo interpretador.

### Definições


#### Tipos de dados e objetos
Os tipos de dados disponíveis em ERPL podem ser escalares ou vetoriais. Os escalares contém um único valor numérico e são representados pelo tipo `Atom`.
Os vetoriais representam uma sequência de zero ou mais dados que podem ser de qualquer tipo, e são representados pelo tipo `Sequence`.

Os tipos implementados na linguagem são 8 ao todo, formando uma pequena hierarquia:

- Atom
  - Integer
  - Double
  - Char
- Sequence
  - String
  - Dependent
  - Application

Os tipos `Atom` e `Sequence` são os mais genéricos e os demais tem propriedades especiais convenientes.

##### Atom
É o tipo escalar mais genérico, os demais tipos escalares são refinamentos deste. Todos os outros tipos podem ser convertidos para Atom, mas nem todos os valores de Atom podem ser convertidos para tipos refinados, devido às restrições de cada tipo.

Não existe token para criar um objeto Atom diretamente, apenas seus tipos derivados.

##### Integer
É um tipo que apenas aceita valores numéricos inteiros.

